home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / asxsrc.arc / M00MCH.C < prev    next >
C/C++ Source or Header  |  1989-08-25  |  3KB  |  214 lines

  1. /* m00mch.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "6800.h"
  16.  
  17. struct    sdp    sdp[] = {
  18.     NULL
  19. };
  20.  
  21. /*
  22.  * Process a machine op.
  23.  */
  24. VOID
  25. machine(mp)
  26. struct mne *mp;
  27. {
  28.     register op, t1;
  29.     struct expr e1;
  30.     struct area *espa;
  31.     char id[NCPS];
  32.     int v1, reg;
  33.  
  34.     reg = 0;
  35.     op = mp->m_valu;
  36.     switch (mp->m_type) {
  37.  
  38.     case S_SDP:
  39.         espa = NULL;
  40.         if (more()) {
  41.             getid(id, -1);
  42.             espa = alookup(id);
  43.             if ( espa == NULL) {
  44.                 err('u');
  45.             }
  46.         }
  47.         if (espa) {
  48.             sdp->s_area = espa;
  49.         } else {
  50.             sdp->s_area = dot->s_area;
  51.         }
  52.         lmode = SLIST;
  53.         break;
  54.  
  55.     case S_INH:
  56.         outab(op);
  57.         break;
  58.  
  59.     case S_PUL:
  60.         v1 = admode(abx);
  61.         if (v1 == S_A) {
  62.             outab(op);
  63.             break;
  64.         }
  65.         if (v1 == S_B) {
  66.             outab(op+1);
  67.             break;
  68.         }
  69.         aerr();
  70.         break;
  71.  
  72.     case S_BRA:
  73.         expr(&e1, 0);
  74.         v1 = e1.e_addr - dot->s_addr - 2;
  75.         if ((v1 < -128) || (v1 > 127))
  76.             aerr();
  77.         if (e1.e_base.e_ap != dot->s_area)
  78.             rerr();
  79.         outab(op);
  80.         outab(v1);
  81.         break;
  82.  
  83.     case S_TYP1:
  84.         t1 = addr(&e1);
  85.         if (t1 == S_A) {
  86.             outab(op|A);
  87.             break;
  88.         }
  89.         if (t1 == S_B) {
  90.             outab(op|B);
  91.             break;
  92.         }
  93.         if (t1 == S_DIR || t1 == S_EXT) {
  94.             outab(op|0x30);
  95.             outrw(&e1, 0);
  96.             break;
  97.         }
  98.         if (t1 == S_INDX) {
  99.             outab(op|X);
  100.             outrb(&e1, 0);
  101.             break;
  102.         }
  103.         aerr();
  104.         break;
  105.  
  106.     case S_TYP2:
  107.         if (!(reg = admode(abx)))
  108.             aerr();
  109.  
  110.     case S_TYP3:
  111.         if (!reg) {
  112.             reg = op & 0x40;
  113.         } else if (reg == S_A) {
  114.             reg = 0x00;
  115.         } else if (reg == S_B) {
  116.             reg = 0x40;
  117.         } else {
  118.             aerr();
  119.             reg = 0x00;
  120.         }
  121.         t1 = addr(&e1);
  122.         if (t1 == S_IMMED) {
  123.             if ((op|0x40) == 0xC7)
  124.                 aerr();
  125.             outab(op|reg);
  126.             outrb(&e1, 0);
  127.             break;
  128.         }
  129.         if (t1 == S_EXT) {
  130.             outab(op|reg|0x30);
  131.             outrw(&e1, 0);
  132.             break;
  133.         }
  134.         if (t1 == S_DIR) {
  135.             outab(op|reg|0x10);
  136.             outrb(&e1, 0);
  137.             break;
  138.         }
  139.         if (t1 == S_INDX) {
  140.             outab(op|reg|0x20);
  141.             outrb(&e1, 0);
  142.             break;
  143.         }
  144.         aerr();
  145.         break;
  146.  
  147.     case S_TYP4:
  148.         t1 = addr(&e1);
  149.         if (t1 == S_IMMED) {
  150.             if (op&0x0D == 0x0D)
  151.                 aerr();
  152.             outab(op);
  153.             outrw(&e1, 0);
  154.             break;
  155.         }
  156.         if (t1 == S_EXT) {
  157.             outab(op|0x30);
  158.             outrw(&e1, 0);
  159.             break;
  160.         }
  161.         if (t1 == S_DIR) {
  162.             outab(op|0x10);
  163.             outrb(&e1, 0);
  164.             break;
  165.         }
  166.         if (t1 == S_INDX) {
  167.             outab(op|0x20);
  168.             outrb(&e1, 0);
  169.             break;
  170.         }
  171.         aerr();
  172.         break;
  173.  
  174.     case S_TYP5:
  175.         t1 = addr(&e1);
  176.         if (t1 == S_DIR || t1 == S_EXT) {
  177.             outab(op|0x10);
  178.             outrw(&e1, 0);
  179.             break;
  180.         }
  181.         if (t1 == S_INDX) {
  182.             outab(op);
  183.             outrb(&e1, 0);
  184.             break;
  185.         }
  186.         aerr();
  187.         break;
  188.  
  189.     default:
  190.         err('o');
  191.     }
  192. }
  193.  
  194.  
  195. /*
  196.  * The next character must be a
  197.  * comma.
  198.  */
  199. VOID
  200. comma()
  201. {
  202.     if (getnb() != ',')
  203.         qerr();
  204. }
  205.  
  206. /*
  207.  * Machine dependent initialization
  208.  */
  209. VOID
  210. minit()
  211. {
  212.     sdp->s_area = dot->s_area;
  213. }
  214.